#include "BlockQueue.hpp"

void *consumer(void *args)
{
  // 消费者从阻塞队列中拿数据
  BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(args);
  while (1)
  {
    int data = bq->pop();
    cout << "获取了一个数据: " << data << endl;
  }
}

void *producer(void *args)
{
  // 生产者将数据放入阻塞队列中
  BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(args);
  int data = 0;
  while (1)
  {
    sleep(1);
    // 生产
    data++;
    bq->push(data);
    cout << "生产了一个数据: " << data << endl;
  }
}

int main()
{
  BlockQueue<int> *bq = new BlockQueue<int>;
  pthread_t c[3], p[5]; //3个消费者，5个生产者

  for (int i = 0; i < 3; i++) pthread_create(c + i, nullptr, consumer, bq);
  for (int i = 0; i < 5; i++) pthread_create(p + i, nullptr, producer, bq);

  for (int i = 0; i < 3; i++) pthread_join(c[i], nullptr);
  for (int i = 0; i < 3; i++) pthread_join(p[i], nullptr);

  delete bq;
  return 0;
}